x86 svm: Disable intercepting CR3 writes when nested paging is enabled
authorKeir Fraser <keir.fraser@citrix.com>
Thu, 16 Jul 2009 07:26:29 +0000 (08:26 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Thu, 16 Jul 2009 07:26:29 +0000 (08:26 +0100)
This patch disables intercepting CR3 writes when nested paging is
enabled. For applications which cause excessive CR3 accesses, the
patch can increase their performance.

Signed-off-by: Wei Huang <wei.huang2@amd.com>
xen/arch/x86/hvm/svm/svm.c
xen/arch/x86/hvm/svm/vmcb.c

index 1cef8be5cb4266e00f8c0fd203a04e7bfdc249f0..767803a7daf04a106bee0681380cf4c174077147 100644 (file)
@@ -1299,6 +1299,9 @@ asmlinkage void svm_vmexit_handler(struct cpu_user_regs *regs)
     eventinj_t eventinj;
     int inst_len, rc;
 
+    if ( paging_mode_hap(v->domain) )
+        v->arch.hvm_vcpu.guest_cr[3] = v->arch.hvm_vcpu.hw_cr[3] = vmcb->cr3;
+
     /*
      * Before doing anything else, we need to sync up the VLAPIC's TPR with
      * SVM's vTPR. It's OK if the guest doesn't touch CR8 (e.g. 32-bit Windows)
index d83fdc185aa60d3f09443c18a705258e23e2e16d..0a56132dd0256906542da9156b83b8c130ec7381 100644 (file)
@@ -235,11 +235,8 @@ static int construct_vmcb(struct vcpu *v)
         vmcb->g_pat = 0x0007040600070406ULL; /* guest PAT */
         vmcb->h_cr3 = pagetable_get_paddr(v->domain->arch.phys_table);
 
-        /*
-         * No point in intercepting CR3 reads, because the hardware will return
-         * the guest version anyway.
-         */
-        vmcb->cr_intercepts &= ~CR_INTERCEPT_CR3_READ;
+        /* No point in intercepting CR3 reads/writes. */
+        vmcb->cr_intercepts &= ~(CR_INTERCEPT_CR3_READ|CR_INTERCEPT_CR3_WRITE);
 
         /*
          * No point in intercepting INVLPG if we don't have shadow pagetables